package com.durian.finance.service.impl;

import com.durian.common.core.utils.StringUtils;
import com.durian.common.log.service.AsyncLogService;
import com.durian.common.security.utils.SecurityUtils;
import com.durian.finance.mapper.JrProductMapper;
import com.durian.finance.service.IJrProductService;
import com.durian.financial.api.domain.JrProduct;
import com.durian.financial.api.domain.enums.AccountTypeEnum;
import com.durian.financial.api.domain.enums.InstalmentEnum;
import com.durian.financial.api.domain.enums.ProductApplyEnum;
import com.durian.financial.api.domain.enums.RepaymentEnum;
import com.durian.financial.api.domain.vo.JrProductVO;
import com.durian.system.api.RemoteDictDataService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 金融产品Service业务层处理
 * 
 * @author durian
 * @date 2022-06-22
 */
@Service
public class JrProductServiceImpl implements IJrProductService 
{
    @Resource
    private JrProductMapper jrProductMapper;

    @Resource
    private RemoteDictDataService remoteDictDataService;

    @Autowired
    private AsyncLogService asyncLogService;


    /**
     * 查询金融产品
     * 
     * @param id 金融产品主键
     * @return 金融产品
     */
    @Override
    public JrProduct selectJrProductById(Long id)
    {
        return jrProductMapper.selectJrProductById(id);
    }

    /**
     * 查询金融产品列表
     * 
     * @param vo 金融产品查询条件
     * @return 金融产品
     */
    @Override
    public Map<Integer, List<JrProduct>> selectJrProductList(JrProductVO vo)
    {

        // 获取分期期限Map
        Map<Integer, String> instalmentMap = InstalmentEnum.getInstalmentEnumMap();

        // 获取还款方式Map
        Map<Integer, String> repaymentMap = RepaymentEnum.getRepaymentEnumMap();

        // 获取审核状态
        Map<Integer, String> applyEnumMap = ProductApplyEnum.getProductApplyEnumMap();

        /*
            获取列表并存入Map
         */
        HashMap<Integer, List<JrProduct>> jrProductMap = new HashMap<>();
        List<JrProduct> instalmentList = jrProductMapper.selectJrProductList(vo.setJrProductType(1));// 获取租房分期列表
        handleJrProduct(instalmentList,instalmentMap,repaymentMap);
        jrProductMap.put(1,instalmentList);

        List<JrProduct> houseLoanList  = jrProductMapper.selectJrProductList(vo.setJrProductType(2));// 获取收房贷列表
        handleJrProduct(houseLoanList,instalmentMap,repaymentMap);
        jrProductMap.put(2,houseLoanList);

        List<JrProduct> leaseList = jrProductMapper.selectJrProductList(vo.setJrProductType(3));// 获取应收租约保理列表
        handleJrProduct(leaseList,instalmentMap,repaymentMap);
        jrProductMap.put(3,leaseList);
        return jrProductMap;
    }

    /**
     * 新增金融产品
     * 
     * @param jrProduct 金融产品
     * @return 结果
     */
    @Override
    public int insertJrProduct(JrProduct jrProduct)
    {
        jrProduct.setCreateUserid(SecurityUtils.getUserId())
                .setDelFlg(0).setCompanyName(jrProduct.getCompanyId().getValue());

        verifyPrivate(jrProduct);
        return jrProductMapper.insertJrProduct(jrProduct);
    }

    /**
     * 修改金融产品
     * 
     * @param jrProduct 金融产品
     * @return 结果
     */
    @Override
    public int updateJrProduct(JrProduct jrProduct)
    {
        jrProduct.setUpdateUserid(SecurityUtils.getUserId())
                .setCompanyName(jrProduct.getCompanyId().getValue());

        verifyPrivate(jrProduct);
        return jrProductMapper.updateJrProduct(jrProduct);
    }

    /**
     * 删除金融产品信息
     * 
     * @param id 金融产品主键
     * @return 结果
     */
    @Override
    public int deleteJrProductById(Long id)
    {

        JrProduct jrProduct = new JrProduct().setId(id).setUpdateUserid(SecurityUtils.getUserId());
        return jrProductMapper.deleteJrProductById(jrProduct);
    }


    /**
     * 处理金融产品的账户信息，分期期限，还款方式
     *
     * @param products 账户信息
     * @param instalmentMap 分期期限
     * @param repaymentMap 还款方式
     */
    static void handleJrProduct(List<JrProduct> products,Map<Integer, String> instalmentMap,Map<Integer, String> repaymentMap){

        // 如果集合不为空
        if (StringUtils.isNotEmpty(products)){

            products.forEach(s -> {

                // 设置还款期限
                if (StringUtils.isNotNull(s.getInstalmentPeriod())){

                    s.setInstalmentPeriodName(instalmentMap.get(s.getInstalmentPeriod().intValue()));
                }

                // 设置还款方式
                s.setRepaymentTypeName(repaymentMap.get(s.getRepaymentType()));

                // 设置银行卡号
                String bunkName = StringUtils.isNotEmpty(s.getBankName()) ? s.getBankName() : "";
                String bunkNumber = StringUtils.isNotEmpty(s.getBankCardNumber()) ? s.getBankCardNumber() : "";
                s.setAccountInformation(bunkName.concat(" ").concat(bunkNumber));

                // 设置申请状态
                s.setApplyStateName(s.getApplyState().getValue());
            });
        }
    }


    /**
     * 如果是对私账户，清空对应信息
     *
     * @param jrProduct
     */
    private void verifyPrivate(JrProduct jrProduct){

        // 如果是对私账户
        if (AccountTypeEnum.PUBLIC_ACCOUNT.equals(jrProduct.getAccountType())){

            jrProduct.setOpeningBank(null).setBankBranchCodeLh(null);
        }
    }


}
